package com.jtp7.demo.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jtp7.demo.entity.TruckInfo;
import com.jtp7.demo.entity.response.PageListResult;
import com.jtp7.demo.service.ICacheRedis;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @author 梅玉松
 * @project: JTP_DEMO
 * @create2021-08-06-13:25 描述:操作缓存的工具类，通用
 */
@Component
public class CacheRedisTemplate<T> implements ICacheRedis<T> {


     RedisTemplate redisTemplate;

    public CacheRedisTemplate(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }


    /**
     * 查询方法的简化封装
     * @param currentPage 当前的页码
     * @param size 每页显示多少条数据
     * @param info 可变参数,配置你加入redis的key
     * @return
     */
     @Override
     public PageListResult<T> redisFuzzySearchBeforeTo(Integer currentPage, Integer size, String ... info) {
        for (String infos : info) {
            if (infos != null && currentPage == null && size == null ) {
                currentPage = 1;
                size = 8;
                return redisFuzzySearchBefore(infos,currentPage,size);
            }
        }

        return null;
    }

    /**
     *  简化redisFuzzySearchBeforeTo方法的
     * @param strings
     * @param currentPage
     * @param size
     * @return
     */
     @Override
     public PageListResult<T> redisFuzzySearchBefore(String strings, Integer currentPage, Integer size) {
        if (strings == null) {
            return null;
        }
        String string =(String) redisTemplate.boundValueOps(strings).get();
        if (string != null) {
            PageListResult<T> pageListResult = JSONObject.parseObject(string, PageListResult.class);
            if (pageListResult.getList().size() <=1){
                return new PageListResult<>(pageListResult.getList(),1);
            }
            com.jtp7.demo.entity.utls.Page page = new com.jtp7.demo.entity.utls.Page(pageListResult.getList().size(),currentPage,size,size);
            return new PageListResult<>(pageListResult.getList(),page.getLast());
        }
        return null;
    }


    /**
     * 查询后方法的简化
     * @param pageString
     * @param currentPage
     * @param size
     * @param info
     * @Param timeout 过期时间分钟
     */
    @Override
    public void redisFuzzySearchAfterTo(String pageString,Integer currentPage, Integer size,Long timeout, String ... info) {

        for (String arg : info) {
            if (arg != null && currentPage == 1 && size == 8 ) {
                currentPage = 1;
                size = 8;
                this.redisFuzzySearchAfter(pageString,arg,currentPage,size,timeout);
            }
        }
    }

    /**
     * 查询后保存缓存
     * @param pageString
     * @param info
     * @param currentPage
     * @param size
     * @Param Timeout 单位分钟
     */
    @Override
    public void redisFuzzySearchAfter(String pageString,String info, Integer currentPage, Integer size,Long timeout) {
        if (pageString != null ) {
            redisTemplate.boundValueOps(info).set(pageString);
            redisTemplate.expire(info,timeout, TimeUnit.MINUTES);
        }
    }


    /**
     * 单个对象修改缓存
     * @param truckInfo
     * @param i 过期的时间 单位秒
     * @deprecate 使用可变参数的方法
     */
    @Override
    @Deprecated
    public void  modifyCacheOne(TruckInfo truckInfo, long i) {
        String jsonString = JSON.toJSONString(truckInfo);

        redisTemplate.boundValueOps(truckInfo.getName()).set(jsonString);
        redisTemplate.boundValueOps(truckInfo.getId()).set(jsonString);
        redisTemplate.boundValueOps(truckInfo.getDrivingCode()).set(jsonString);
        redisTemplate.boundValueOps(truckInfo.getPhone()).set(jsonString);


        redisTemplate.expire(truckInfo.getId(),i, TimeUnit.SECONDS);
        redisTemplate.expire(truckInfo.getName(),i, TimeUnit.SECONDS);
        redisTemplate.expire(truckInfo.getDrivingCode(),i, TimeUnit.SECONDS);
        redisTemplate.expire(truckInfo.getPhone(),i, TimeUnit.SECONDS);
    }

    /**
     * 修改的缓存操作
     *
     * @param truckInfo
     */
    @Override
    @Deprecated
    public  void updtaRedis(TruckInfo  truckInfo,String key){
        redisTemplate.delete(key);
        modifyCacheOne(truckInfo,60);
    }

    @Override
    public String getKey(String key) {
       return(String) redisTemplate.boundValueOps(key).get();
    }

    @Override
    public void deletKey(T key) {
        redisTemplate.delete(key);
    }

    /**
     * 修改的缓存操作
     *
     * @param info 可变参数
     */
    @Override
    public void updtaRedis(T o,Long timeout, String... info) {
        for (String names : info) {
            modifyCacheOne(timeout,o,names);
        }
    }
    /**
     * 单个对象修改缓存
     *
     * @param timeout       过期的时间 单位分钟
     * @param object  对象
     * @param names 可变参数
     */
    @Override
    public void modifyCacheOne(Long timeout,Object object, String names) {
            String jsonString = JSON.toJSONString(object);
            redisTemplate.boundValueOps(names).set(jsonString);
            redisTemplate.expire(names,timeout, TimeUnit.MINUTES);

    }

}
